package com.example.utils;

import cn.hutool.core.codec.Base64;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.example.entity.Account; // 导入 Account 实体类
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
import java.util.Optional;

public class RequestInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 获取当前请求的 URI
        String requestURI = request.getRequestURI();

        // 使用 switch-case 语句根据请求 URI 进行判断
        switch (requestURI) {
            // 如果请求 URI 是 "/login"，则直接放行
            case "/login":
                return true;
            // 否则，执行 handleToken 方法进行 token 处理，并返回处理结果
            default:
                String token = request.getHeader("token"); // 获取请求头中的 token 字符串
                return handleToken(token, request, response);
        }
    }

    private boolean handleToken(String token, HttpServletRequest request, HttpServletResponse response) {
        // 判断 token 是否为空
        if (StringUtils.isEmpty(token)) {
            // 如果为空，则返回未授权的响应
            writeUnauthorizedResponse(response);
            return false;
        }

        // 解析 token 并获取账号信息
        Optional<Account> account = parseToken(token);

        // 判断解析出来的账号信息是否为空或角色不是 "ADMIN"
        if (!account.isPresent() || !"ADMIN".equals(account.get().getRole())) {
            // 如果为空或不是管理员，则将用户 ID 设置到 session 中
            request.getSession().setAttribute("id", account.orElse(new Account()).getId());
            return true;
        }

        // 如果解析出来的账号信息不是管理员，则返回未授权的响应
        writeUnauthorizedResponse(response);
        return false;
    }

    private Optional<Account> parseToken(String token) {
        try {
            // Base64 解码 token 字符串
            String decodedString = Base64.decodeStr(token.substring(1, token.length() - 1));

            // 替换转义字符并解析 JSON 字符串
            JSONObject jsonObject = JSONUtil.parseObj(decodedString.replace("\\", ""));

            // 从 JSON 对象中获取账号信息并封装成 Account 对象
            Account account = new Account(jsonObject.getInt("id"), jsonObject.getStr("role"));

            // 将账号信息封装成 Optional 对象并返回
            return Optional.of(account);
        } catch (Exception e) {
            // 如果解析过程中出现异常，则返回空 Optional 对象
            return Optional.empty();
        }
    }

    private void writeUnauthorizedResponse(HttpServletResponse response) {
        try (PrintWriter writer = response.getWriter()) {
            // 创建 JSON 对象并设置错误码为 401
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("code", 401);

            // 将 JSON 对象转换为字符串并写入响应
            writer.write(jsonObject.toString());
        } catch (Exception e) {
            // 如果写入响应过程中出现异常，则打印异常信息
            e.printStackTrace();
        }
    }
}
